package com.xinya.wanandroidclient.http

/**
 *
 * @ClassName:      ApiResponse$
 * @Description:    WanAndroid的 返回数据基类
 * @Author:         xinya
 * @CreateDate:     2021/2/24$ 11:28$
 * @UpdateRemark:   更新内容
 * @Version:        1.0
 */
data class ApiResponse<T>(
    var data: T?,
    val errorCode: Int,
    val errorMsg: String
) {
    /**
     * 如果是服务端返回的数据,那么一定不为null, 0， 200直接将数据返回,不判空
     * 如果data为null,证明服务器出错,错误已经是不可逆了，只需保证客户端不闪退，给予提示就行
     */
    fun result():T {
        when (errorCode) {
            0, 200 -> {
                return data!!
            }
            -1001 -> {
                throw ApiException("请先登录", errorCode)
            }
            -1 -> throw ApiException("登录失败", errorCode)
            else -> {
                throw ApiException(errorMsg, errorCode)
            }
        }
    }

    /**
     * 如果某些接口存在data为null的情况,需传入class对象
     * 生成空对象。避免后面做一系列空判断
     */
    fun result(clazz:Class<T>): T {
        when (errorCode) {
            //请求成功
            0, 200 -> {
                //避免业务层做null判断,通过反射将null替换为T类型空对象
                if (data == null) {
                    data = clazz.newInstance()
                }
                return data!!
            }
            //未登陆请求需要用户信息的接口
            -1001 -> {
                throw ApiException("请先登陆", -1)
            }
            //登录失败
            -1 -> {
                throw ApiException("登陆失败", -1)
            }
        }
        //其他错误
        throw ApiException(errorMsg, errorCode)
    }
}

class ApiException(val errorMsg: String, val errorCode: Int) : Throwable()